package com.palmelf.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;

public class FileUtil {
	private static Logger LOG = Logger.getLogger("FindFileList");
	// 监控上传上来的临时文件的文件名,这个文件不能被扫描
	private final static String tempFileName = "aaa.jpg";

	/**
	 * 递归获取指定目录下的文件名
	 * 
	 * @param fileType
	 * 
	 * @param path
	 *            指定目录
	 */
	public static List<String> recursionGetFileDirectory(File file, List<String> fileType) {
		List<String> subFileNameList = new ArrayList<String>();
		// 判断文件是否存在
		if (file.exists()) {
			// 如果是目录则递归计算其内容的总大小
			if (file.isDirectory()) {
				File[] children = file.listFiles();
				for (File f : children)
					subFileNameList.addAll(recursionGetFileDirectory(f, fileType));
			} else {// 如果是文件则直接返回其大小,以“兆”为单位
				String filePath = file.getAbsolutePath();
				String subPrefix = FileUtil.getFileType(filePath);
				if (fileType != null && fileType.size() > 0) {
					if (fileType.contains(subPrefix)) {
						if (!filePath.endsWith(tempFileName)) {
							subFileNameList.add(filePath);
						} else {
							LOG.warn("不处理临时文件" + filePath);
						}
					} else {
						LOG.warn("文件类型不符合" + filePath + "..fileType" + fileType.toString() + "---subPrefix:"
								+ subPrefix);
					}
					// 当不指定文件名时,表示所有类型的文件
				} else {

					subFileNameList.add(filePath);
				}
			}
		} else {
			LOG.error("文件不存在 \t" + file.getAbsolutePath());
		}
		return subFileNameList;
	}

	/**
	 * 获取指定目录下面的文件夹
	 * 
	 * @param file
	 * @return
	 */
	public static List<String> findChildFolder(File file) {
		List<String> subFileNameList = new ArrayList<String>();
		// 判断文件是否存在
		if (file.exists()) {
			// 如果是目录则递归计算其内容的总大小
			if (file.isDirectory()) {
				File[] children = file.listFiles();
				for (File f : children) {
					if (f.isDirectory()) {
						subFileNameList.add(f.getName());
					}
				}
			}
		}
		return subFileNameList;
	}

	/**
	 * 递归获取指定目录下,自 oldTime以来,新增的文件名列表
	 * 
	 * @param path
	 *            指定目录
	 */
	// 有问题.不使用
	@Deprecated
	public static List<String> findNewFile(File file, Long oldTime, List<String> fileType) {
		LOG.debug("查找该目录以及子目录的所有文件" + file.getAbsolutePath());
		List<String> subFileNameList = new ArrayList<String>();
		// 判断文件是否存在
		if (file.exists()) {
			// 如果是目录则递归计算其内容的总大小
			if (file.isDirectory()) {
				File[] children = file.listFiles();
				for (File f : children)
					subFileNameList.addAll(findNewFile(f, oldTime, fileType));
			} else {
				boolean isNew = file.lastModified() > oldTime;
				LOG.debug("时间戳" + oldTime + "-----文件时间" + file.lastModified() + "\t" + isNew);
				if (isNew) {
					subFileNameList.add(file.getAbsolutePath());
				}
			}
		} else {
			LOG.error("文件不存在 \t" + file.getAbsolutePath());
		}
		return subFileNameList;
	}

	/**
	 * 获取两个List的不同元素<br>
	 * 找出存在list2中，却list1不存在的元素的集合
	 * 
	 * @param list1
	 * @param list2
	 * @return
	 */
	public static List<String> getDifferent(List<String> list1, List<String> list2) {
		List<String> diff = new ArrayList<String>();
		for (String str : list1) {
			if (!list2.contains(str)) {
				diff.add(str);
			}
		}
		return diff;
	}

	/**
	 * 获取文件类型
	 * 
	 * @param fileName
	 * @return 文件类型为小写
	 */
	public static String getFileType(String fileName) {
		return FilenameUtils.getExtension(fileName);
	}

	public static void main(String[] args) {
		System.out.println(getFileType("ddddd.jpg"));
		System.out.println(getFileType("ddddd."));
		System.out.println(getFileType("ddddd.j"));
		System.out.println(getFileType("ddddd.BMP"));
		System.out.println("-----------------------");
		String str = "E:\\test\\5555rrrrrrr55d.jpg";
		System.out.println(FilenameUtils.getName(str));
		System.out.println((new File(str)).getName());
		/*
		 * File dirPath = new File("E:\\application\\TheDemonBlade" ); //
		 * List<String> fileNameList = // FileUtil.recursionGetFileDirectory
		 * (dirPath); Long oldTime = System.currentTimeMillis(); List<String>
		 * fileNameList = FileUtil.findNewFile(dirPath, oldTime); for (String
		 * string : fileNameList) { System.out.println(string); }
		 */
		/*
		 * List<String> list1 = new ArrayList<String>(); List<String> list2 =
		 * new ArrayList<String>(); list1.add("1"); list1.add("2");
		 * list2.add("1"); System.out.println(getDifferent(list1,
		 * list2).size());
		 */
	}
}
